Carregando bibliotecas

library(DT)
library(MASS)
library(dplyr)
library(stats)
library(plotly)
library(readxl)
library(caTools)
library(ggplot2)
library(corrplot)
library(reticulate)

Exercícios de Múltipla Escolha

Funções úteis

# Gradiente Descendente
gradiente_descendente <- function(df, teta, taxa_aprendizado, iteracoes) {
  x <- df$x
  y <- df$y
  m = length(y)
  
  for (i in 1:iteracoes) {
    h = teta[1] + teta[2] * x
    t0 = teta[1] - taxa_aprendizado*(1/m)*sum((h - y))
    t1 = teta[2] - taxa_aprendizado*(1/m)*sum((h - y)*x)
    teta  = c(t0, t1)
  }                         
  
  return(teta)
}

# Normaliza DF
normaliza_df <- function(df) {
  maximo <- apply(df, 2, max) 
  minimo <- apply(df, 2, min)
  
  res <- as.data.frame(scale(df, center = minimo, scale = maximo - minimo))
  return(res)
}

Exercício Computacional - 1

# Leitura DF
df <- read.table("../inputs/data_computacional_1.txt", sep = ",") %>% 
  rename(population = V1,
         profit = V2)

# Análise Exploratória Simples
p <- df %>% 
  ggplot(aes(x = population, y = profit)) +
  geom_line()

ggplotly(p)
# Criando Modelo
modelo <- lm("profit ~ population", data = df)
modelo
## 
## Call:
## lm(formula = "profit ~ population", data = df)
## 
## Coefficients:
## (Intercept)   population  
##      -3.896        1.193
# Predições
predi <- predict(modelo, df)

# Resíduos
residuos <- modelo$residuals
media_residuos <- residuos %>% mean()
media_residuos
## [1] -2.628508e-16
# Predição para 100,000 habitantes
predicao <- predict(modelo, data.frame(population = 100000/10000)) * 10000
predicao
##        1 
## 80345.56
# Utilizando o Gradiente Descendente
df_gd <- df %>% rename(x = population, y = profit)
parametros_gd <- gradiente_descendente(df_gd, c(0, 0), 0.001, 20000)
parametros_gd
## [1] -3.787753  1.182181
# Utilizando Equações Normais
unit_col <- replicate(nrow(df), 1)

X = data.frame(unit_col, df$population) %>% 
  as.matrix()

tetas_eqn = solve(t(X) %*% X) %*% (t(X) %*% df$profit) 
c(tetas_eqn[[1]], tetas_eqn[[2]])
## [1] -3.895781  1.193034

Como esperado os parâmetros obtidos foram os mesmos, desconsiderando diferenças geradas por aproximações

Exercício Computacional - 2

# Leitura do DF
df <- MASS::Boston

# Simples Análise Exploratória
p <- df %>% 
  ggplot(aes(x = lstat, y = medv)) +
  geom_point()

ggplotly(p)
# Criação do Modelo
modelo <- lm("medv ~ lstat", data = df)
modelo
## 
## Call:
## lm(formula = "medv ~ lstat", data = df)
## 
## Coefficients:
## (Intercept)        lstat  
##       34.55        -0.95
# Predições
predi <- predict(modelo, dplyr::select(df, lstat))

# Média dos resíduos
residuos <- modelo$residuals
media_residuos <- residuos %>% mean()
media_residuos
## [1] 6.600194e-16
# Predição para 25%
predicao <- predict(modelo, data.frame(lstat = c(25))) * 1000
predicao
##        1 
## 10802.61
# Utilizando Gradiente Descendente
df_gd <- df %>% 
  dplyr::select(medv, lstat) %>% 
  dplyr::rename(x = lstat, y = medv)

tetas_gd <- gradiente_descendente(df_gd, c(0, 0), 0.001, 200000)
tetas_gd
## [1] 34.5538409 -0.9500494
# Utilizando Equações Normais
unit_col <- replicate(nrow(df), 1)

X = data.frame(unit_col, df$lstat) %>% 
  as.matrix()

tetas_eqn = solve(t(X) %*% X) %*% (t(X) %*% df$medv) 
c(tetas_eqn[[1]], tetas_eqn[[2]])
## [1] 34.5538409 -0.9500494

Como esperado os parâmetros obtidos foram os mesmos, desconsiderando diferenças geradas por aproximações

Exercício Computacional - 3

# Leitura e filtragem do DF
df <- MASS::Boston %>%
  dplyr::select(c("crim", "rm", "lstat", "medv"))

# Aplicando Normalização
df_norm <- normaliza_df(df)

# Simples Análise Exploratória
cor <- stats::cor(df)
corrplot(cor,
         type = "upper",
         tl.col = "black",
         method = "number",
         bg = "lightblue")

# Criação do Modelo
modelo <- lm("medv ~ crim + rm + lstat", data = df_norm)
modelo
## 
## Call:
## lm(formula = "medv ~ crim + rm + lstat", data = df_norm)
## 
## Coefficients:
## (Intercept)         crim           rm        lstat  
##      0.2225      -0.2035       0.6051      -0.4659
# Resíduos
residuos <- modelo$residuals
media_residuos <- residuos %>% mean()
media_residuos
## [1] 1.367354e-17
# Predição
predicao <- predict(modelo, data.frame(crim = c(0.15), rm = c(5), lstat = 20))
predicao_norm <- predicao*(max(df$medv) - min(df$medv)) + min(df$medv)
predicao_norm
##       1 
## -269.51